package cn.gyn.gynrpc.core.filter;

import cn.gyn.gynrpc.core.api.Filter;
import cn.gyn.gynrpc.core.api.RpcRequest;
import cn.gyn.gynrpc.core.api.RpcResponse;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * 用来实现：一个方法给定的参数，第一次调用后，后续再来同样的参数，直接返回第一次的调用结果回去
 */
public class CacheFilter implements Filter {
    // Java 中的并发 HashMap 类，用于存储键-值对，其中键和值可以从多个线程中同时访问和修改。
    //替换成guava cache ，加容量、过期时间、淘汰策略等 todo
    static Map<String, Object> cache = new ConcurrentHashMap();

    @Override
    public Object prefilter(RpcRequest request) {
        return cache.get(request.toString());
    }

    @Override
    public Object postfilter(RpcRequest request, RpcResponse response, Object result) {
        cache.putIfAbsent(request.toString(), result);
        return result;
    }
}
